

from .models import Student,Classes

from rest_framework import serializers
#  普通类 ==》 功能 ==》  需要继承
# class  StudentSerializers(serializers.Serializer):
#     #  变成一个序列化器 类
#
#     # read_only=True 只允许前端查看学生的id不能修改
#     #  label  前端的备注信息
#     id = serializers.IntegerField(read_only=True,label='ID')
#     name = serializers.CharField(max_length=20,label='姓名')
#     #  required=False  系统校验的时候允许传入的年龄为空
#     age = serializers.IntegerField(required=False,label='年龄')
#     sex = serializers.IntegerField(required=False,label='性别')
#     create_time = serializers.DateTimeField(required=False,label='创建时间')
#     update_time = serializers.DateTimeField(required=False,label='修改时间')
#     # is_delete = serializers.BooleanField(required=False,label='逻辑删除',default=False)
#
#     num =serializers.IntegerField(default=55)
#
#     # 校验数据的时候  序列化器字段和模型字段要一致  即是传入数据的时候
#     #  响应数据的时候  序列化器字段可以不和模型字段一致
#
#
#     #  数据持久化操作
#     #  重写 create方法
#     def create(self,validated_data):
#         #  validated_data  前端传入的 json数据 经过序列化器转为 python数据格式  {}
#         print(validated_data)
#         # **validated_data 函数拆包
#         return Student.objects.create(**validated_data)
#
#     def update(self,instance,validated_data):
#         #  instance  原本的数据
#         #  validated_data  传入的新数据
#         print(instance,validated_data)
#         #  get("name",instance.name)  如果数据为空那么就保持原来的数据
#         instance.name = validated_data.get("name",instance.name)
#         instance.age = validated_data.get("age",instance.age)
#         instance.sex = validated_data.get("sex",instance.sex)
#
#         #  这里的save（）用的模型里面的保存方法
#         instance.save()
#         #  返回更新后的数据
#         return instance


#   StudentSerializes ==>ModelSerializer  ==>Serializer
# 更为完整强大的Serializer    =>ModelSerializer(模型序列化器)



#  一个序列化器
class StudentSerializerSimple(serializers.ModelSerializer):
    class Meta:
        model = Student
        exclude = ["is_delete","create_time","update_time","classes"]


#  班级的序列化器
class ClassSerializer(serializers.ModelSerializer):

    #  班级去查询学生的数据  没有外键属于 反向查询  Classes.student_set
    #  student_set 不能随便更改  必须要用管理器名
    #  一个班级有多个学生    所以对学生进行序列化器
    # student_set = StudentSerializers(many=True,read_only=True)  #   many=True  表示做了一次序列化操作且因为是多个学生
    student_set = StudentSerializerSimple(many=True,read_only=True)  #   many=True  表示做了一次序列化操作且因为是多个学生

    class Meta:
        model = Classes
        fields = '__all__'


# StudentSerializerSimple 和  StudentSerializers 是一样的  都是对学生模型进行序列化和反序列化操作
#  StudentSerializerSimple  展示的要少一些
#   StudentSerializers  展示的要多一些

#  学生班级的序列化器
class ClassesSerializerSimple(serializers.ModelSerializer):
    class Meta:
        model = Classes
        fields = '__all__'

#  学生的序列化器
class StudentSerializers(serializers.ModelSerializer):
    # 获取id为2的班级对象
    class_obj = Classes.objects.get(id=2)
    # 将is_delete设为0
    class_obj.is_delete = 0
    # 保存到数据库
    class_obj.save()

    #  只需要把模型对应的字段进行校验
    #  只是需要告诉校验的模型是哪一个
    #  反映给前端的字段是哪一些

    #  外键字段在学生模型里面 所以 学生查询学校是正向查询
    #  所以  Student.classes.name
    #  read_only 设置只读  不允许学生进行更改  ji是反序列化无法操作
    classname = serializers.CharField(source="classes.name",read_only=True)


    #  一个学生一个班级
    # classes = ClassSerializer(read_only=True)
    classes = ClassesSerializerSimple(read_only=True)

    class Meta:
        model = Student

        #   __all__ 所以字段
        fields = '__all__'  # 展示所有字段
# 序列化 python 转 json
        #  不显示摸个字段  序列化和反序列化都无法操作
        # exclude = ["is_delete"]
        #  extra_kwargs 出了可以限制字段  还能限制年龄
        extra_kwargs = {
            #  write_only 在进行反序列化的时候可以编写  进行序列化时不可以
            'classes':{"write_only":True},
            # 'age':{"min_value":16,"max_value":100}
        }

        #  属性级别的校验方法  name
        #  validate_字段名   该字段的校验规则
        #  value  拿到的就是  前段传入的  value = name = 值

    # def validate_name(self, value):
    #     if 'dj' not in value:
    #         raise serializers.ValidationError("名字必须要有dj")
    #     else:
    #         return value

        #  对象级的校验  多个字段的校验规则

    def validate(self, attrs):

        # attrs  拿到的就是前端传入的数据
        if 'dj' not in attrs.get("name"):
            raise serializers.ValidationError("名字必须要有dj")
        if not (attrs.get("age") > 16 and attrs.get("age") < 100):
            raise serializers.ValidationError("年龄不合法")
        return attrs